home *** CD-ROM | disk | FTP | other *** search
/ Aminet 4 / Aminet 4 - November 1994.iso / aminet / dev / c / restracklib_0_2.lha / ResTrackLib / restrack.h < prev    next >
C/C++ Source or Header  |  1994-07-31  |  10KB  |  255 lines

  1. /******************************************************************************
  2.  
  3.     MODUL
  4.     restrack.h
  5.  
  6.     DESCRIPTION
  7.     Resource tracking for developing programs in C. The resource
  8.     trackering library contains stubs for common library and Amiga OS
  9.     calls and tracks the allocated resources. The process is
  10.     initialized like this:
  11.  
  12.         StartResourceTracking (flags);
  13.  
  14.     Where <flags> is a series of Resources that should be tracked. If
  15.     you allocate a resource after this call, it is tracked and the tags
  16.     are removed if you free the resource again. If you don't and call
  17.  
  18.         EndResourceTracking ();
  19.  
  20.     any still allocated resources are displayed and freed. The output of
  21.     this function looks like this:
  22.  
  23.         Function        Where        Resource
  24.         AllocMem()      test.c:156      500 Bytes
  25.         Open()          text.c:24       File "RAM:RTL"
  26.  
  27.     "Function" is the name of the function that allocated the resource.
  28.     "Where" gives the file and line where the resource was allocated
  29.     and "Resource" gives more information about the specifc type of the
  30.     resource itself.
  31.  
  32.         There may be cases where you DON'T want resource tracking to
  33.     happen. The ResTrackLib has four means to avoid resource tracking.
  34.  
  35.         1. You can switch it off alltogether by specifiying
  36.  
  37.             #define RESOURCE_TRACKING        0
  38.  
  39.            anwhere before you include this file.
  40.         2. You can use the NRT_xxx version of a function (like
  41.            NRT_AllocMem()). This uses a version of the function
  42.            which doesn't use resource tracking.
  43.         3. You can set a flag in the library that turns off
  44.            resource tracking temporarily with SetResTrackLevel(),
  45.            IncResTrackLevel() and DecResTrackLevel(). If the
  46.            level is < 0, no resource tracking will happen.
  47.         4. You can specifiy all resources that should or
  48.            should not be tracked with StartResourceTracking().
  49.  
  50.     And there is another goodie: PrintTrackedResources (); which
  51.     prints a full list of all tracked resources. And last but not
  52.     least, all calls to free a resource check their arguments for
  53.     validity. If you free a non-allocated resource (eg. with a
  54.     wrong pointer), an extensive error message is printed. See below
  55.     for a list of all currently tracker resources.
  56.  
  57. ******************************************************************************/
  58.  
  59. /* check if the user actually wants resource tracking */
  60. #if !defined(RESOURCE_TRACKING) || RESOURCE_TRACKING
  61.  
  62. # ifndef RESTRACK_H
  63. # define RESTRACK_H
  64.  
  65.  
  66. /**************************************
  67.         Includes
  68. **************************************/
  69. #ifndef EXEC_TYPES_H
  70. #   include <exec/types.h>
  71. #endif
  72. #ifndef DOS_DOS_H
  73. #   include <dos/dos.h>
  74. #endif
  75.  
  76.  
  77. /**************************************
  78.     Defines und Strukturen
  79. **************************************/
  80. #ifndef RTL_INTERN    /* make sure we don't get the macros :-) */
  81.  
  82. /* here comes the magic: We just overwrite the normal functions with macros */
  83.  
  84. /* c.lib */
  85.  
  86. /* DOS */
  87. #define Open(file,mode)         __rtl_Open(file,mode,__FILE__,__LINE__)
  88. #define Close(fh)               __rtl_Close(fh,__FILE__,__LINE__)
  89. #define Lock(name,type)         __rtl_Lock(name,type,__FILE__,__LINE__)
  90. #define UnLock(lock)            __rtl_UnLock(lock,__FILE__,__LINE__)
  91. #define DupLock(lock)           __rtl_DupLock(lock,__FILE__,__LINE__)
  92. #define CreateDir(name)         __rtl_CreateDir(name,__FILE__,__LINE__)
  93. #define CurrentDir(lock)        __rtl_CurrentDir(lock,__FILE__,__LINE__)
  94.  
  95. /* Exec */
  96. #define RTL_DEF0(name)          __rtl_ ## name (__FILE__,__LINE__)
  97. #define RTL_DEF1(name,p1)       __rtl_ ## name (p1,__FILE__,__LINE__)
  98. #define RTL_DEF2(name,p1,p2)    __rtl_ ## name (p1,p2,__FILE__,__LINE__)
  99. #define RTL_DEF3(name,p1,p2,p3) __rtl_ ## name (p1,p2,p3,__FILE__,__LINE__)
  100. #define RTL_DEF4(name,p1,p2,p3,p4) __rtl_ ## name (p1,p2,p3,p4,__FILE__,__LINE__)
  101.  
  102. #define AllocMem(size,flags)    __rtl_AllocMem(size,flags,__FILE__,__LINE__)
  103. #define FreeMem(adr,size)       __rtl_FreeMem(adr,size,__FILE__,__LINE__)
  104. #define AllocVec(size,flags)    __rtl_AllocVec(size,flags,__FILE__,__LINE__)
  105. #define FreeVec(adr)            __rtl_FreeVec(adr,__FILE__,__LINE__)
  106. #define OpenLibrary(name,ver)   __rtl_OpenLibrary(name,ver,__FILE__,__LINE__)
  107. #define CloseLibrary(lib)       __rtl_CloseLibrary(lib,__FILE__,__LINE__)
  108. #define Allocate(fl,size)       __rtl_Allocate(fl,size,__FILE__,__LINE__)
  109. #define Deallocate(fl,mem,size) __rtl_Deallocate(fl,mem,size,__FILE__,__LINE__)
  110. #define AllocEntry(list)        RTL_DEF1(AllocEntry,list)
  111. #define FreeEntry(list)         RTL_DEF1(FreeEntry,list)
  112. #define CreateMsgPort()         RTL_DEF0(CreateMsgPort)
  113. #define DeleteMsgPort(port)     RTL_DEF1(DeleteMsgPort,port)
  114. #define OpenDevice(dev,unit,ior,flags) RTL_DEF4(OpenDevice,dev,unit,ior,flags)
  115. #define CloseDevice(ior)        RTL_DEF1(CloseDevice,ior)
  116. #define DoIO(ior)               RTL_DEF1(DoIO,ior)
  117. #define SendIO(ior)             RTL_DEF1(SendIO,ior)
  118. #define CheckIO(ior)            RTL_DEF1(CheckIO,ior)
  119. #define WaitIO(ior)             RTL_DEF1(WaitIO,ior)
  120. #define AbortIO(ior)            RTL_DEF1(AbortIO,ior)
  121.  
  122. /* Graphics */
  123. #define RectFill(rp,x1,y1,x2,y2)    __rtl_RectFill(rp,x1,y1,x2,y2,__FILE__,__LINE__)
  124.  
  125. #endif /* RTL_INTERN */
  126.  
  127. /* Flags for StartResourceTracking() */
  128. #define RTL_TRACK    0x00000000    /* track specified resources */
  129. #define RTL_NOTRACK    0x80000000    /* track all but the spec. res. */
  130. #define RTL_CLIB    0x00000001    /* track c.lib */
  131. #define RTL_DOS     0x00000002    /* track dos calls */
  132. #define RTL_EXEC    0x00000004    /* track exec stuff */
  133.  
  134. #define RTL_ALL     0x7FFFFFFF    /* track everything we have */
  135.  
  136. /* Defines for Prototypes */
  137. #define RTL_PROTO0(ret,name)                                            \
  138.     ret __rtl_ ## name (const char *, int);                             \
  139.     ret NRT_ ## name (void);
  140. #define RTL_PROTO1(ret,name,arg)                                        \
  141.     ret __rtl_ ## name (arg, const char *, int);                        \
  142.     ret NRT_ ## name (arg);
  143. #define RTL_PROTO2(ret,name,arg1,arg2)                                  \
  144.     ret __rtl_ ## name (arg1, arg2, const char *, int);                 \
  145.     ret NRT_ ## name (arg1, arg2);
  146. #define RTL_PROTO3(ret,name,a1,a2,a3)                                   \
  147.     ret __rtl_ ## name (a1,a2,a3, const char *, int);                   \
  148.     ret NRT_ ## name (a1,a2,a3);
  149. #define RTL_PROTO4(ret,name,a1,a2,a3,a4)                                \
  150.     ret __rtl_ ## name (a1,a2,a3,a4, const char *, int);                \
  151.     ret NRT_ ## name (a1,a2,a3,a4);
  152. #define RTL_PROTO5(ret,name,a1,a2,a3,a4,a5)                             \
  153.     ret __rtl_ ## name (a1,a2,a3,a4,a5, const char *, int);             \
  154.     ret NRT_ ## name (a1,a2,a3,a4,a5);
  155.  
  156.  
  157. /**************************************
  158.         Globale Variable
  159. **************************************/
  160.  
  161.  
  162. /**************************************
  163.            Prototypes
  164. **************************************/
  165. extern void StartResourceTracking    (ULONG);
  166. extern void SetResourceTracking     (ULONG);
  167. extern void PrintTrackedResources    (void);
  168. extern LONG SetResourceTrackingLevel    (LONG);
  169. extern LONG IncResourceTrackingLevel    (void);
  170. extern LONG DecResourceTrackingLevel    (void);
  171. extern void EndResourceTracking     (void);
  172.  
  173. /* Prototypes for resource tracking calls */
  174. /* c.lib */
  175.  
  176. /* DOS */
  177. RTL_PROTO2(BPTR,Open,STRPTR name, long accessMode)
  178. RTL_PROTO1(LONG,Close,BPTR file)
  179. RTL_PROTO2(BPTR,Lock,STRPTR name, long type)
  180. RTL_PROTO1(void,UnLock,BPTR lock)
  181. RTL_PROTO1(BPTR,DupLock,BPTR lock)
  182. RTL_PROTO1(BPTR,CurrentDir,BPTR lock)
  183. RTL_PROTO1(BPTR,CreateDir,STRPTR name)
  184.  
  185. /* Exec */
  186. RTL_PROTO2(APTR,AllocMem,ULONG size, ULONG flags)
  187. RTL_PROTO2(void,FreeMem,APTR mem, ULONG size)
  188. RTL_PROTO2(APTR,AllocVec,ULONG, ULONG)
  189. RTL_PROTO1(void,FreeVec,APTR)
  190. RTL_PROTO2(struct Library *,OpenLibrary,UBYTE * name, ULONG version)
  191. RTL_PROTO1(void,CloseLibrary,struct Library * library)
  192. RTL_PROTO2(APTR,Allocate,struct MemHeader * freeList, ULONG size)
  193. RTL_PROTO3(void,Deallocate,struct MemHeader * freeList, APTR mem,ULONG size)
  194. RTL_PROTO1(struct MemList *,AllocEntry,struct MemList * list)
  195. RTL_PROTO1(void,FreeEntry,struct MemList * list)
  196. RTL_PROTO0(struct MsgPort *,CreateMsgPort)
  197. RTL_PROTO1(void,DeleteMsgPort,struct MsgPort * mp)
  198. RTL_PROTO4(BYTE,OpenDevice,UBYTE * devName,ULONG unit,struct IORequest *ioRequest, ULONG flags)
  199. RTL_PROTO1(void,CloseDevice,struct IORequest * ioRequest)
  200. RTL_PROTO1(BYTE,DoIO,struct IORequest * ioRequest)
  201. RTL_PROTO1(void,SendIO,struct IORequest * ioRequest)
  202. RTL_PROTO1(struct IORequest *,CheckIO,struct IORequest * ioRequest)
  203. RTL_PROTO1(BYTE,WaitIO,struct IORequest * ioRequest)
  204. RTL_PROTO1(void,AbortIO,struct IORequest * ioRequest)
  205.  
  206. /* Graphics */
  207. RTL_PROTO5(void,RectFill,struct RastPort * rp, WORD, WORD, WORD, WORD)
  208.  
  209. # endif /* RESTRACK_H */
  210. #else /* No resource tracking */
  211. #   define NRT_Open        Open
  212. #   define NRT_Close        Close
  213. #   define NRT_Lock        Lock
  214. #   define NRT_UnLock        UnLock
  215. #   define NRT_DupLock        DupLock
  216. #   define NRT_CreateDir    CreateDir
  217. #   define NRT_CurrentDir   CurrentDir
  218.  
  219. #   define NRT_AllocMem     AllocMem
  220. #   define NRT_FreeMem        FreeMem
  221. #   define NRT_AllocVec     AllocVec
  222. #   define NRT_FreeVec        FreeVec
  223. #   define NRT_OpenLibrary  OpenLibrary
  224. #   define NRT_CloseLibrary CloseLibrary
  225. #   define NRT_Allocate     Allocate
  226. #   define NRT_Deallocate   Deallocate
  227. #   define NRT_AllocEntry   AllocEntry
  228. #   define NRT_FreeEntry    FreeEntry
  229. #   define NRT_CreateMsgPort CreateMsgPort
  230. #   define NRT_DeleteMsgPort DeleteMsgPort
  231. #   define NRT_OpenDevice   OpenDevice
  232. #   define NRT_CloseDevice  CloseDevice
  233. #   define NRT_DoIO        DoIO
  234. #   define NRT_SendIO        SendIO
  235. #   define NRT_CheckIO        CheckIO
  236. #   define NRT_WaitIO        WaitIO
  237. #   define NRT_AbortIO        AbortIO
  238.  
  239. #   define NRT_RectFill     RectFill
  240.  
  241. #   define StartResourceTracking(fl)    ;
  242. #   define SetResourceTracking(fl)      ;
  243. #   define PrintTrackedResources    ;
  244. #   define EndResourceTracking        ;
  245.  
  246. extern LONG SetResourceTrackingLevel    (LONG);
  247. extern LONG IncResourceTrackingLevel    (void);
  248. extern LONG DecResourceTrackingLevel    (void);
  249.  
  250. #endif /* RESOURCE_TRACKING */
  251.  
  252. /******************************************************************************
  253. *****  ENDE restrack.h
  254. ******************************************************************************/
  255.